;	PDP-11 FLOATING POINT PACKAGE
;	INTEGER MULTIPLY
;	INTEGER DIVIDE
;
;	MODULES INCLUDED:
;	1. MUL
;	2. DIV
;
;
;
;
R0	=	%0
R1	=	%1
R2	=	%2
R3	=	%3
R4	=	%4
R5	=	%5
SP	=	%6
PC	=	%7
MUL:	MOV	@R0,R5		;PICK UP THE MULTIPLIER
	MOV	@R1,R1		;PICK UP THE MULTIPLICAND
	CLR	R3		;ZIP-ZAP-ZOWIE AND SWOSH
	CLR	R4
	TST	R5
	BGE	.+6	;->	;TEST SIGN AND CHANGE IF NECESSARY
	NEG	R5	;  I	;CHANGE SIGN
	INC	R3	;  I	;REMEMBER THE ORIGINAL SIGN
	TST	R1	;<-	;TEST THE OTHER WORD
	BGE	.+6	;->	SAME TEST AS BEFORE
	NEG	R1	;  I	;NEGATE TO CHANGE THE SIGN
	DEC	R3	;  I	;USE THE OPPOSITE SIGN MANAGEMENT
	MOV	#21,R2	;<-	;SET UP THE CYCLE COUNTER
M.ML1:	CLC			;CLEAR CARRY FOR ROTATES
	ROR	R4		;SHIFT MULTIPLIER AND PARTIAL PRODUCT
	ROR	R5
	BCC	.+4	;->	;CHECK AND SEE IF AN ADDITION IS NEEDED
	ADD	R1,R4	;  I	;ADD MULTIPLIER TO PARTIAL PRODUCT
	DEC	R2	;<-	;DECREMENT COUNTER
	BGT	M.ML1		;BREANCH IF MORE TO DO
	TST	R3		;TEST SIGN CHANGE WORD
	BEQ	.+10	;->	;BRANCH AROUND THE ADJUSTMENT
	NEG	R4	;  I	
	NEG	R5	;  I
	SBC	R4	;  I	;DO A DOUBLE PRECISION NEGATION
	MOV	R5,(R0)+;<-
	MOV	R4,@R0		;MOVE THE PRODUCT TO DESTINATION
	RTS	PC		;RETURN TO THE CALLER
DIV:	CLR	-(SP)		;SET UP A SIGN CONTROL WORD
	MOV	(R0)+,R3	;PICK UP THE
	MOV	(R0)+,R2	;DOUBLE PRECISION DIVIDEND
	BGE	.+14	;->	;CHECK THE SIGN
	DECB	1(SP)	;  I	;KEEP TRACK OF THE ORIGINAL
	NEG	R2	;  I	;SIGN AND NEGATE
	NEG	R3	;  I	;THE ORIGINAL NUMBER
	SBC	R2	;  I
	MOV	(R1)+,R4;<-	;PICK UP THE DIVISOR
	BEQ	M.DVV		;DIVISION BY ZERO IS A NO-NO
	BGT	.+6	;->	;CHECK THE SIGN
	INC	@SP	;  I	;AND KEEP TRACK AS ABOVE
	NEG	R4	;  I
	MOV	R4,R5	;<-	;MOVE THE DIVISOR AND
	NEG	R5		;NEGATE FOR THE ALGORITHM
	ADD	R5,R2		;PREFORM THE INITIAL SUBTRACTION
	BCS	M.DVV		;CARRY SET IS AN OVERFLOW
	MOV	#20,-(SP)	;SET UP A COUNTER
	CLR	-(SP)		;THIS IS A LASTING CARRY BIT
M.DV1:	ROL	R3		;ROTATE ONE LEFT
	ROL	R2
	TST	@SP		;CHECK THE LAST CARRY
	BEQ	M.DV2		;IF ZERO ADD ELSE SUBTRACT
	CLR	@SP		;CLEAR THE CARRY
	ADD	R5,R2		;DO ONE MORE STEP
	BR	M.DV3
M.DV2:	ADD	R4,R2		;-2N+N=N FOR THIS STEP
M.DV3:	ADC	@SP		;KEEP IT A WHILE
	BEQ	.+4	;->	;IF ZERO OMIT UPDATE
	INC	R3	;  I	;NO CARRY POSSIBLE
	DEC	2(SP)	;<-	;DECREMENT COUNTER
	BGT	M.DV1		;BRANCH IF MORE TO DO
	ROR	R3		;SEE ABOUT THE LAST CYCLE
	BCS	M.DV4		;OMIT CORRECTION IF ONE
	ADD	R4,R2		;CORRECT REMAINDER
	CLC
M.DV4:	ROL	R3		;REPLACE THE LAST BIT
	CMP	(SP)+,(SP)+	;POP TWO WORDS
	TST	@SP		;TEST FOR REMAINDER CHANGES
	BGE	.+12	;->	;OMIT IF POSITVE
	NEG	R2	;  I	;NEGATE REMAINDER
	CLRB	1(SP)	;  I	;CLEAR SIGN
	DEC	@SP	;  I	;BUT DO A GOOD JOB ON QUOTIENT
	CMP	#100000,R3;<-	;TEST FOR THE BUG IN THE ALGORITHM
	BLO	M.DVV		;EXIT WITH ERROR OF TOO BIG
	BEQ	M.DVC		;CHECK FOR OVERFLOW
M.DV6:	TST	(SP)+		;TEST FOR QUOTIENT ADJUSTMENT
	BEQ	M.DV5		;IF ZERO NONE NEEDED
	NEG	R3		;NEGATE QUOTIENT
M.DV5:	MOV	R2,-(R0)	;MOVE REMAINDER
	MOV	R3,-(R0)	;THEN QUOTIENT TO DEST.
	RTS	PC
M.DVV:	TST	(SP)+		;REMOVE SIGN WORD
	SEV			;SET OVERFLOW
	RTS	PC
M.DVC:	TST	(SP)		;TEST FOR NEGATIVE
	BEQ	M.DVV		;IF POSITIVE THEN OOPS!
	BR	M.DV6		;IF NEGATIVE OK
	.EOT
                                                                                          